<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>再论函数</title>
</head>
<body>
    <script>
        /**
         *  函数才是JS的第一公民
         * */
        function Foo(){
              //函数内部的共有属性，实例化对象可以使用(可以被继承到)
                this.username ="lily";
              //函数内部的共有方法(可以被继承到)
              //函数中如果使用this的话一般都会配合new调用函数 此时this.属性是对象的属性
              //如果不使用new来调用的话，那么就相当于为window绑定一个变量
                this.getName=function(){
                console.log(this.name);
            }
             //函数内部的私有属性，只能在函数内部使用 或者通过闭包返回出去 外部不能访问，也不能通过函数名.属性名的方式进行访问 因为超出作用域
             let age=12;
            
            //函数内部的私有方法,只能在函数内部使用 或者通过闭包返回出去 外部不能访问，也不能通过函数名.属性名的方式进行访问 因为超出作用域
            let getAge =function(){
                console.log("12");

                alert(fpp());


            }    

            getAge();
        }

        /**
         * 函数作为一种特殊的对象是可以绑定函数和属性的
         * 之所以上面那种方式绑定了访问不到是因为超出作用域
         * 那么在全局位置为函数绑定函数和变量是可以的
         * 
         * 
         * https://blog.csdn.net/qq_37860930/article/details/78551725
        */


        /**为函数名上绑定函数和属性是静态类型的 只能通过函数名.的形式进行调用*/
        Foo.foo1=function(){
            console.log("foo1()");
        }

        Foo.a =123;

        /**
         * 作用域链是实例对象沿着__proto__去找，对象找不到属性就沿着__proto__去找和函数没有关系，
        */

        Foo.prototype.fpp =function(){
           return "fpp";
        }

        Foo.foo1();
        console.log(Foo.a);

        Foo();
    </script>
</body>
</html>